package socketmvc.core.context;

import socketmvc.core.config.SocketMvcConfig;
import socketmvc.core.packets.ResponseFuture;
import socketmvc.core.packets.basic.IPacket;
import socketmvc.core.util.StringUtils;

import java.util.UUID;
import java.util.concurrent.Future;

public interface IContext {

    /**
     * 当前数据包
     * 当接受到客户端的数据包之后，该函数返回的就是当前接受到的数据包
     * @return packet
     */
    IPacket getPacket() ;

    /**
     * 获取附加值
     * @param key k
     * @return v
     */
    Object getAttr(String key);

    /**
     * 设置附加值
     * @param key k
     * @param val v
     * @return v
     */
    Object setAttr(String key,Object val);

    /**
     * 删除附加值
     * @param key k
     * @return 被删除的值
     */
    Object removeAttr(String key);

    /**
     * tcp,udp,ws
     * @return 连接的类型
     */
    String getType();

    /**
     * 发送数据包到当前context
     * @param packet 数据包
     */
    void send(IPacket packet);


    /**
     * 发送数据包到当前context,并等待响应结果
     * @param packet 数据包
     * @return 等待结果
     */
    Future<IPacket> sendSync(IPacket packet);

    /**
     * 关闭当前context
     * 注意：关闭意味着彻底抛弃链接，关闭后就不能再发送消息了
     */
    void close();

    /**
     * 获取客户端host信息
     * @return 客户端host信息
     */
    SocketMvcConfig.IpConfig getClientConnInfo();

    /**
     * 获取服务端host信息
     * @return 服务端host信息
     */
    SocketMvcConfig.IpConfig getServerConnInfo();

    default Future<IPacket> createResponseFuture(IPacket packet){
        String responseKey = packet.getResponseKey();
        if (StringUtils.isEmpty(responseKey)){
            responseKey = UUID.randomUUID().toString().replace("-","");
            packet.setResponseKey(responseKey);
        }
        ResponseFuture responseFuture = new ResponseFuture(responseKey);
        ResponseFuture.submit(responseFuture);
        return responseFuture;
    }
}
